package stringTest;

/**
 * 测试String是否==
 * 实际上是测试生成String对象的方式
 * @author lcx
 *
 */
public class StringEqualTest {
	
	public static void testEqual()
	{
		 // 情况1：两个直接赋值String变量进行比较
		//指向常量区同一对象，a1==a2?  true
		String a1="abc";
		String a2="abc";
		System.out.println("a1==a2?  "+(a1==a2));
		
		//情况2：直接赋值String和new出来的String进行比较
		//指向对象一个在常量区，一个在堆区，a1==a3?   false
		String a3=new String("abc");
		System.out.println("a1==a3?   "+(a1==a3));
		
		//情况3：直接赋值String和intern出来的String进行比较
		//指向常量区同一对象，a1==a4?  true
		String a4=a3.intern();
		System.out.println("a1==a4?   "+(a1==a4));
		
		//情况4：直接赋值String和常量表达式赋值的String进行比较
		//jvm在编译时将a5赋值方式转化为String a5="abc"，a1==a5?  true
		String a5="a"+"b"+"c";
		System.out.println("a1==a5?   "+(a1==a5));
		
		//情况5：直接赋值String和变量表达式赋值的String进行比较
		//情况5：jvm在运行其将new一个StringBuilder，append()方法拼接字符串，并将a6存于堆区，a1==a6?   false
		String tag="a";
		String a6=tag+"bc";
		System.out.println("a1==a6?   "+(a1==a6));
		
		//情况6：直接赋值String和final变量表达式赋值的String进行比较
		//jvm在编译时将a7赋值方式转化为String a7="abc"，a1==a7?  true
		final String start="a";
		String a7=start+"bc";
		System.out.println("a1==a7?   "+(a1==a7));
	}
	
	public static void main(String[] args) {
		testEqual();
	}
}
